/*
 * PPonderados.java
 *
 * Created on 15 de abril de 2002, 15:25
 */

package MetodosContinuos;

/**
 *
 * @author  multiobjetivo
 * @version
 */

public class PPonderados {
    private int n_func;
    private int n_var;
    private InterfacesGenerales.Plataforma Padre2;
    private InterfacesContinuas.PlataformaContinua Padre;
    private double[][] matrizCoeficientes;
    private double[][] matrizFuncionesEvaluadasOptimo;
    private double[] Zmax;
    private double[] Zmin;
    private double[] coeficintesFuncPonder;
    private double[] peso;
    private double[] Xrespuesta;
    private double[] ZevaluadosXPonder;
    
    
    public PPonderados(InterfacesContinuas.PlataformaContinua parent, InterfacesGenerales.Plataforma parent2) {
        Padre2= parent2;
        Padre=parent;
        n_func=DatosEntrada.DatosContinuos.getNFunciones();
        n_var=DatosEntrada.DatosContinuos.getNVariables();
        peso=DatosEntrada.DatosContinuos.getPesos();
        matrizCoeficientes=DatosEntrada.DatosContinuos.getMatrizCoef();
        try {
            DatosEntrada.DatosContinuos.ProgramacionLinealGeneral();
            matrizFuncionesEvaluadasOptimo=DatosEntrada.DatosContinuos.getMatrizZOptimos();
            creaZmax();
        } catch(Exception e) {
            e.printStackTrace();
        }
        
        try {
            Utiles.ProgramacionLinealGeneral.ProgramacionLineal(creaFuncionPonderacion(peso));
            Xrespuesta=Utiles.ProgramacionLinealGeneral.getVectorXoptimos();
            
        } catch(Exception e) {
            e.printStackTrace();
        }
        
        ZevaluadosXPonder= calculoFuncObjts(Xrespuesta,matrizCoeficientes);
        ResultadosContinuos.ResultCont pas = new ResultadosContinuos.ResultCont(Xrespuesta,ZevaluadosXPonder,creaPorcentLogro(),"Promedios ponderados",Padre.getTablaFunObj().getData(),Padre.getTablaFunObj().getNombresCol(),Padre.getTablaRest().getData(),Padre.getTablaRest().getNombresCol(),4,peso,true);
        Padre.getJDesktopPane2().add(pas);
        Padre.getJTabbedPane1().setSelectedIndex(2);
    }
    
    private void creaZmax(){
        Zmax=new double[n_func];
        Zmin=new double[n_func];
        Zmax=Utiles.SacaMaximosMinimos.MaxiColum(matrizFuncionesEvaluadasOptimo,matrizFuncionesEvaluadasOptimo.length,matrizFuncionesEvaluadasOptimo[0].length);
        Zmin=Utiles.SacaMaximosMinimos.MiniColum(matrizFuncionesEvaluadasOptimo,matrizFuncionesEvaluadasOptimo.length,matrizFuncionesEvaluadasOptimo[0].length);
    }
    
    private double[] calculoFuncObjts(double[] vect, double[][] mat){
        double[] Zeval= new double[n_func];
        try {
            Zeval= Utiles.ProgramacionLinealGeneral.calculoXporFtranspuesta(vect, mat);
        } catch(Exception e){}
        return Zeval;
    }
    
    private double[] creaFuncionPonderacion(double[] pesos){
        double[][] NewCoeficiente = new double[n_func][n_var];
        coeficintesFuncPonder= new double[n_var];
        for(int i=0;i<n_func;i++){
            for(int j=0;j<n_var;j++){
                if(Zmax[i]-Zmin[i]!=0){
                    NewCoeficiente[i][j]=pesos[i]*matrizCoeficientes[i][j]/(Zmax[i]-Zmin[i]);
                }
                if(Zmax[i]==Zmin[i]&&Zmax[i]!=0){
                    NewCoeficiente[i][j]=pesos[i]*matrizCoeficientes[i][j]/(Zmax[i]);
                }
            }
        }
        for(int i=0;i<n_func;i++){
            for(int j=0;j<n_var;j++){
                coeficintesFuncPonder[j]=coeficintesFuncPonder[j]+NewCoeficiente[i][j];
            }
        }
        return coeficintesFuncPonder;
    }
    
    private double[] creaPorcentLogro(){
        double[] Zporcent= new double[n_func];
        for(int i=0;i<n_func;i++){
            if(Zmax[i]-Zmin[i]!=0){
                Zporcent[i]=((ZevaluadosXPonder[i]-Zmin[i])*100)/(Zmax[i]-Zmin[i]);
            }
            if(Zmax[i]==Zmin[i]&&Zmax[i]!=0){
                Zporcent[i]=((ZevaluadosXPonder[i]-Zmin[i])*100)/(Zmax[i]);
            }
        }
        return Zporcent;
    }   
}